/*
    基于MVC模式的oj_server网络服务：
    1、与客户端交互，获取客户端请求，交付数据给control模块，control模块返回结果，响应给用户
*/
#include <signal.h>
#include "control.hpp"
#include "../util/httplib.h"

using namespace httplib;
using namespace ns_control;

Control* ctlp = nullptr;
void hander(int signo)
{
    ctlp->recoveryAllMachine();
}

int main()
{
    // 1、定义一个网络服务
    Server svr;

    Control ctl;
    ctlp = &ctl; //保证hander函数中也可以使用到ctl对象
    signal(SIGQUIT, hander); //通过捕获3号信息（ctrl+/）的方式，让所有下线主机上线

    // 2、预绑定资源
    // 2.1、请求所有题目列表
    svr.Get("/questions/list", [&ctl](const Request &req, Response &resp){
        std::string html;
        ctl.questionsListHtml(html);
        resp.set_content(html.c_str(), "text/html;charset=utf-8"); 
    });

    // 2.2、请求某个题目
    svr.Get(R"(/questions/(\d+))", [&ctl](const Request &req, Response &resp){
        std::string number = req.matches[1]; //Request结构体会自动拆分uri，将其维护成一个字符串数组
        std::string html;
        ctl.questionHtml(number, html);
        resp.set_content(html.c_str(), "text/html;charset=utf-8");
    });

    // 2.3、提交代码
    svr.Post(R"(/questions/(\d+)/submit)", [&ctl](const Request &req, Response &resp){
        std::string number = req.matches[1];
        std::string result_json;
        ctl.judge(number, req.body, result_json);
        resp.set_content(result_json, "application/json;charset=utf-8"); 
    });

    // 3、启动服务
    svr.set_base_dir("./wwwroot");
    svr.listen("0.0.0.0", 8888);
    return 0;
}